/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
package org.ebayopensource.turmeric.utils.jpa;
import java.util.concurrent.atomic.AtomicInteger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
public class EntityManagerContext {
private static final ThreadLocal<EntityManager> entityManager = new ThreadLocal<EntityManager>();
private static final ThreadLocal<AtomicInteger> reentrancy = new ThreadLocal<AtomicInteger>() {
@Override
protected AtomicInteger initialValue() {
return new AtomicInteger();
}
};
public static EntityManager get() {
return entityManager.get();
}
public static void open(EntityManagerFactory entityManagerFactory) {
if (get() == null) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityManagerContext.entityManager.set(entityManager);
entityManager.getTransaction().begin();
}
reentrancy.get().incrementAndGet();
}
static void abort() {
EntityManager entityManager = get();
EntityTransaction transaction = entityManager.getTransaction();
if (transaction != null) {
transaction.setRollbackOnly();
}
}
public static void close() {
boolean close = reentrancy.get().decrementAndGet() == 0;
if (close) {
EntityManager entityManager = get();
EntityManagerContext.entityManager.set(null);
EntityTransaction transaction = entityManager.getTransaction();
if (transaction != null) {
if (transaction.getRollbackOnly()) {
rollback(transaction);
} else {
try {
transaction.commit();
} catch (RuntimeException x) {
rollback(transaction);
}
}
}
}
}
private static void rollback(EntityTransaction transaction) {
try {
transaction.rollback();
} catch (RuntimeException x) {
// Ignored
}
}
}